/*
 * 原版接口
 */
import * as server from "@minecraft/server";
/*
 * 蛋白石数据
 */
import * as data_entity from "../data/entity";
/*
 * 蛋白石组件
 */
import * as derived_tools from "../system/derived_tools";
import * as native_tools from "../system/native_tools";
import * as achieve_plan from "../system/achieve_plan";
import * as math_tools from "../system/math_tools";
/**
 * * 百灵绘卷
 */
export function ChorusPictureTrigger(): server.ItemCustomComponent {
    return {
        onUse(source) {
            /**
             * * 触发自定义组件的玩家
             */
            const player = source.source;
            /**
             * * 触发自定义组件的物品
             */
            const item = source.itemStack;
            /**
             * * 玩家背包
             */
            const container = player.getComponent('inventory')?.container;
            // 判断条件是否满足
            if (!container || !player || !item) return;
            // 判断是否冷却完成
            if (!achieve_plan.ControlEventTrigger.EntityToken(item.typeId, player, 140)) return;
            /**
             * * 检测 当前高度
             */
            const testHeight = player.location.y < player.dimension.heightRange.min + 32;
            /**
             * * 判断 是否执行过 初始召唤
             */
            const rule = player.getDynamicProperty('entity:house_create_after') ?? false;
            /**
             * * 解析 权重信息
             */
            const analysis = derived_tools.AnalysisWeight(data_entity.chorus_call_role);
            // 检测当前高度是否可用
            if (testHeight) return player.sendMessage([native_tools.EntityTranslate(player), { text: '-> 当前高度不足, 无法使用<§l§9 百灵绘卷 §r>' }]);
            // 播放 召唤动画
            derived_tools.CompleteSummonAnimation(player, player.getHeadLocation());
            // 清除 物品
            container?.setItem(player.selectedSlotIndex);
            // 执行初始化生成
            if (!rule) return InitialSummoning(player);
            // 召唤 随机角色
            server.system.runTimeout(() => RandomCallRole(player, analysis.source, analysis.index), 40);
            // 发送 信息
            native_tools.IntelMessage(player, 5, '新的伙伴已经出现, 快使用§9[§n§l 精灵结契 §r§9]§r与§9[§6 领航者 §9]§r缔结属于你们的§9[§u 契约 §9]§r吧!!');
        }
    }
};
/**
 * * 生成 初始角色
 */
function InitialSummoning(player: server.Player) {
    /**
     * * 定义 队列信息
     */
    const queue = ['entity_adrift:crystal', 'entity_adrift:moonlight', 'entity_adrift:roaring'];
    // 召唤 琉璃 月华 啸天
    server.system.runTimeout(() => AppointCallRole(player, queue), 8);
    // 设置 已经 完成初始化生成
    player.setDynamicProperty('entity:house_create_after', true);
    // 显示 引导提示
    derived_tools.PlayPrompt(player, "召唤星辉雅居");
    // 召唤 星辉雅居
    StarlightHouse(player);
};
/**
 * * 创建 星辉雅居
 * 
 * @param {server.Player} player - 触发事件的玩家
 */
function StarlightHouse(player: server.Player) {
    /**
     * * 获取 游戏规则
     */
    const rule = server.world.getDynamicProperty('game_rules:regenerate.starlight_house') ?? true;
    /**
     * * 定义 坐标基准点
     */
    const reference = math_tools.Vector.add(player.location, { x: -13, y: -15, z: -13 });
    /**
     * * 读取 建筑结构
     */
    const template = server.world.structureManager.get('mystructure:starlight_house');
    // 判断是否生成结构
    if (rule === false) return EmergencyPlan(player);
    // 检测 建筑结构
    if (!template) return player.sendMessage([native_tools.EntityTranslate(player), { text: '-> 未能获取到<§l§9 星辉雅居 §r>的结构数据文件' }]);
    // 预填充空间
    native_tools.TryFillBlocks(player.dimension, reference, math_tools.Vector.add(reference, { x: 24, y: 24, z: 24 }), 'minecraft:white_stained_glass');
    // 加载 建筑结构
    server.system.runTimeout(() => server.world.structureManager.place(template, player.dimension, reference), 2);
    // 移动 玩家位置
    server.system.runTimeout(() => player.applyKnockback((Math.random() * 2) - 1, (Math.random() * 2), 1, -1), 4);
    // 设置 游戏规则
    if (rule == true) server.world.setDynamicProperty('game_rules:regenerate.starlight_house', false);
};
/**
 * * 紧急物资补偿计划
 * 
 * @param {server.Player} player - 接收补偿物资的玩家对象
 */
function EmergencyPlan(player: server.Player) {
    /**
     * * 补偿物资列表
     */
    const subsidy: server.ItemStack[] = [
        new server.ItemStack('item_tool:magic_crystal_screwdriver'),
        new server.ItemStack('item_tool:magic_crystal_shield'),
        new server.ItemStack('item_tool:magic_crystal_hammer'),
        new server.ItemStack('item_tool:magic_crystal_wrench'),
        new server.ItemStack('item_tool:magic_crystal_key'),
        new server.ItemStack('item_tool:magic_crystal_bow'),
        new server.ItemStack('item_tool:magic_crystal_hoe'),
        new server.ItemStack('item_literature:magic_handbook'),
        new server.ItemStack('item_literature:faerie_healing'),
        new server.ItemStack('item_equipment:magic_crystal_armor_lv1'),
        new server.ItemStack('minecraft:barrel')
    ];
    // 生成 补偿物资
    subsidy.forEach(item => native_tools.TrySpawnItem(player.dimension, item, player.location));
};
/**
 * * 随机角色召唤事件
 * 
 * @param {server.Player} player - 玩家对象
 * 
 * @param {string[]} queue - 角色队列
 * 
 * @param {number} index - 随机索引
 */
function RandomCallRole(player: server.Player, queue: string[], index: number) {
    /**
     * * 定义 坐标基准点
     */
    const vertex0 = math_tools.Vector.add(player.location, { x: 3, y: 5, z: 3 });
    /**
     * * 定义 坐标基准点
     */
    const vertex1 = math_tools.Vector.add(player.location, { x: -3, y: 0, z: -3 });
    /**
     * * 定义 角色召唤锚点
     */
    const anchor = math_tools.Vector.random(vertex0, vertex1);
    // 播放 粒子效果
    player.spawnParticle('constant:the_cracks_of_the_misty_sea', anchor);
    // 判断 是否已经召唤过 治疗类角色
    if (!player.getDynamicProperty('entity:healer_role_up')) {
        /**
         * * 治疗型 角色队列
         */
        const choice = derived_tools.AnalysisWeight(data_entity.call_healer_role);
        player.setDynamicProperty('entity:healer_role_up', true);
        native_tools.TrySpawnEntity(player.dimension, choice.output, anchor);
        return;
    };
    // 判断 是否已经召唤过 增伤类角色
    if (!player.getDynamicProperty('entity:fortify_role_up')) {
        /**
         * * 增伤型 角色队列
         */
        const choice = derived_tools.AnalysisWeight(data_entity.call_fortify_role);
        player.setDynamicProperty('entity:fortify_role_up', true);
        native_tools.TrySpawnEntity(player.dimension, choice.output, anchor);
        return;
    };
    // 执行 角色召唤
    switch (math_tools.Random({ min: 1, max: 32 }, true)) {
        case 16:
            WaspClusterRaidTrigger.Create(player.id, 20, { location_group: [player.getHeadLocation()], dimension_group: [player.dimension] });
            player.onScreenDisplay.setTitle('§c§l< 野蜂 袭击 > !!!§r');
            native_tools.TrySpawnEntity(player.dimension, queue[index], anchor);
            break;

        default: native_tools.TrySpawnEntity(player.dimension, queue[index], anchor); break;
    }
};
/**
 * * 指定角色召唤事件
 * 
 * @param {server.Player} player - 玩家对象
 * 
 * @param {string[]} queue - 角色队列
 */
function AppointCallRole(player: server.Player, queue: string[]) {
    /**
     * * 定义 坐标基准点
     */
    const vertex0 = math_tools.Vector.add(player.location, { x: 2, y: 2, z: 2 });
    /**
     * * 定义 坐标基准点
     */
    const vertex1 = math_tools.Vector.add(player.location, { x: -2, y: 0, z: -2 });
    // 播放 粒子效果
    player.spawnParticle('constant:the_cracks_of_the_misty_sea', math_tools.Vector.random(vertex0, vertex1));
    // 执行 角色召唤
    queue.forEach(entity => native_tools.TrySpawnEntity(player.dimension, entity, math_tools.Vector.random(vertex0, vertex1)));
};
/**
 * * 野蜂机群袭击触发器
 * 
 * @param {number} cooldown tick间隔时间, 建议值为: 20
 */
class WaspClusterRaidTrigger extends achieve_plan.Template {
    /**
     * * 定义 事件计时器
     */
    protected eventTimer = 0;
    public afterPlanEvent(data: achieve_plan.AFTER_PLAN_DATA) {
        // 检测 条件是否齐全
        if (!this.annex.dimension_group) return data.remove();
        if (!this.annex.location_group) return data.remove();
        /**
         * * 获取 事件维度
         */
        const dimension = this.annex.dimension_group[0];
        /**
         * * 获取 原始坐标
         */
        const proto = this.annex.location_group[0];
        /**
         * * 获取 随机坐标
         */
        const current = math_tools.Vector.add(proto, { x: Math.random() * 16 - 8, y: Math.random() * 16, z: Math.random() * 16 - 8 });
        // 显示 粒子效果
        native_tools.TrySpawnParticle(dimension, 'constant:the_cracks_of_the_misty_sea', current);
        /**
         * * 解析 权重信息
         */
        const analysis = derived_tools.AnalysisWeight(data_entity.wasp_cluster_raid);
        // 生成 野蜂实体
        const wasp = native_tools.TrySpawnEntity(dimension, analysis.output, current);
        if (wasp instanceof server.Entity) wasp.nameTag = '§u野蜂 袭击§r';
        // 当事件结束时 生成战利品
        if (this.eventTimer >= 15) {
            native_tools.TrySpawnItem(dimension, new server.ItemStack('item_crystal:eternal_energy'), current);
            native_tools.TrySpawnParticle(dimension, 'constant:fireworks_salvo_rune_red', current);
            native_tools.TrySpawnParticle(dimension, 'constant:disperse_rune_red', current);
            native_tools.TrySpawnParticle(dimension, 'constant:erupt_rune_red', current);
            return data.remove();
        };
        this.eventTimer += 1;
    };
};
/**
 * * 流光之星
 */
export function FlowingStarTrigger(): server.ItemCustomComponent {
    return {
        onUse(source) {
            /**
             * * 触发自定义组件的玩家
             */
            const player = source.source;
            /**
             * * 触发自定义组件的物品
             */
            const item = source.itemStack;
            /**
             * * 玩家背包
             */
            const container = player.getComponent('inventory')?.container;
            // 判断条件是否满足
            if (!container || !player || !item) return;
            // 判断是否冷却完成
            if (!achieve_plan.ControlEventTrigger.EntityToken(item.typeId, player, 140)) return;
            /**
             * * 检测 当前高度
             */
            const testHeight = player.location.y < player.dimension.heightRange.min + 32;
            // 检测当前高度是否可用
            if (testHeight) return player.sendMessage([native_tools.EntityTranslate(player), { text: '-> 当前高度不足, 无法使用<§l§9 流光之星 §r>' }]);
            // 清除 物品
            container?.setItem(player.selectedSlotIndex);
            /**
             * * 定义 坐标基准点
             */
            const reference = math_tools.Vector.add(player.location, { x: -13, y: -15, z: -13 });
            /**
             * * 读取 建筑结构
             */
            const template = server.world.structureManager.get('mystructure:starlight_house');
            // 预先填充空间
            native_tools.TryFillBlocks(player.dimension, reference, math_tools.Vector.add(reference, { x: 24, y: 24, z: 24 }), 'minecraft:white_stained_glass');
            // 检测 建筑结构
            if (!template) return player.sendMessage([native_tools.EntityTranslate(player), { text: '-> 未能获取到<§l§9 星辉雅居 §r>的结构数据文件' }]);
            // 加载 建筑结构
            server.system.runTimeout(() => server.world.structureManager.place(template, player.dimension, reference), 2);
            // 移动 玩家位置
            server.system.runTimeout(() => player.applyKnockback((Math.random() * 2) - 1, (Math.random() * 2), 1, -1), 4);
            // 发送 信息
            native_tools.IntelMessage(player, 5, '『 星辉雅居 』');
            // 播放 召唤动画
            derived_tools.CompleteSummonAnimation(player, player.getHeadLocation());
        }
    }
};
/**
 * * 星月诗篇
 */
export function MoonAndStarsTrigger(): server.ItemCustomComponent {
    return {
        onUse(source) {
            /**
             * * 触发自定义组件的玩家
             */
            const player = source.source;
            /**
             * * 触发自定义组件的物品
             */
            const item = source.itemStack;
            /**
             * * 玩家背包
             */
            const container = player.getComponent('inventory')?.container;
            // 判断条件是否满足
            if (!container || !player || !item) return;
            // 判断是否冷却完成
            if (!achieve_plan.ControlEventTrigger.EntityToken(item.typeId, player, 80)) return;
            /**
             * * 获取 实体类型
             */
            const typeId = item.getDynamicProperty('reduction_pureness:type') as string;
            // 检测 物品数据类型是否完整且正确
            if (!typeId) return player.sendMessage(`§l§4<§c 物品数据 §4>§r数据丢失, 无法继续使用`);
            // 更新 物品冷却
            item.getComponent('minecraft:cooldown')?.startCooldown(player);
            // 执行召唤流程
            native_tools.SummoningEntityWithData(player, container, typeId);
            // 播放 召唤动画
            derived_tools.ParticleSummonAnimation(player, player.location);
        }
    }
};